package com.ycd.test;

import com.ycd.utils.ESClientUtil;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;

import java.nio.charset.StandardCharsets;

public class ComplexQuery {

    /**
     * 使用顺序
     * 		1.query：开启查询，而且是DSL查询，会进行结果的相关度计算
     * 			1.bool：开启组合查询
     * 				1.must：在里面的条件使用and连接
     * 					1.match/term：分词查询
     * 				2.filter：开启DSL过滤
     * 					1.match/term：不分词查询
     * 					2.range：范围查询
     * 		2.size：每页展示条数
     * 		3.from：数据的起始位置，计算公式=（要查询的页码-1）*每页展示条数
     * 		4.sort：排序
     */
    @Test
    public void test(){
        /**
         * 复杂查询
         * - 查询表
         * - name包含：小明
         * - age在1-5之间
         * - sex=1
         * - 每页展示条数4
         * - 从4页开始查
         * - 按照id升序
         */
        // 1.先建立es连接
        TransportClient client = ESClientUtil.getClient();
        // 2.要搜索的索引-pethome
        SearchRequestBuilder search = client.prepareSearch("pethome");
        // 3.开启查询query-有个工具类QueryBuilders可以设置bool
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        // 4.通过bool拿到must->match,设置分词查询条件
        boolQuery.must(QueryBuilders.matchQuery("name", "小明"));
        // 5.通过bool拿到filter->range/term,设置不分词查询和范围查询条件
        boolQuery.filter(QueryBuilders.rangeQuery("age").gte(1).lte(5));
        boolQuery.filter(QueryBuilders.termQuery("sex",1));
        // 每页展示条数4
        search.setSize(4);
        // 从4页开始查
        search.setFrom(4);
        // 按照id升序
        search.addSort("id", SortOrder.ASC);
        // 得到hits包含的数据
        SearchHit[] hits = search.get().getHits().getHits();
        // 遍历数据并打印搜索的结果
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsMap());
        }
        // 关流
        client.close();
    }
}
